/*
 * Copyright (c) 2006-2022, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-10-26     RealThread   first version
 */

#ifndef __BOARD_H__
#define __BOARD_H__

#include <drv_common.h>
#include <stm32f4xx.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /*-------------------------- CHIP CONFIG BEGIN --------------------------*/

#define CHIP_FAMILY_STM32
#define CHIP_SERIES_STM32F4
#define CHIP_NAME_STM32F407VE

    /*-------------------------- CHIP CONFIG END --------------------------*/

    /*-------------------------- ROM/RAM CONFIG BEGIN --------------------------*/

#define ROM_START ((uint32_t)0x08000000)
#define ROM_SIZE  (512 * 1024)
#define ROM_END   ((uint32_t)(ROM_START + ROM_SIZE))

#define RAM_START (0x20000000)
#define RAM_SIZE  (128 * 1024)
#define RAM_END   (RAM_START + RAM_SIZE)

    /*-------------------------- ROM/RAM CONFIG END --------------------------*/

    /*-------------------------- CLOCK CONFIG BEGIN --------------------------*/

#define BSP_CLOCK_SOURCE          ("HSI")
#define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)0)
#define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)168)

/*-------------------------- CLOCK CONFIG END --------------------------*/

/*-------------------------- UART CONFIG BEGIN --------------------------*/

/** After configuring corresponding UART or UART DMA, you can use it.
 *
 * STEP 1, define macro define related to the serial port opening based on the serial port number
 *                 such as     #define BSP_USING_UART1
 *
 * STEP 2, according to the corresponding pin of serial port, define the related serial port
 * information macro such as     #define BSP_UART1_TX_PIN       "PA9" #define BSP_UART1_RX_PIN
 * "PA10"
 *
 * STEP 3, if you want using SERIAL DMA, you must open it in the RT-Thread Settings.
 *                 RT-Thread Setting -> Components -> Device Drivers -> Serial Device Drivers ->
 * Enable Serial DMA Mode
 *
 * STEP 4, according to serial port number to define serial port tx/rx DMA function in the board.h
 * file such as     #define BSP_UART1_RX_USING_DMA
 *
 */

// RTT Console调试(备用485模块接口)
#define BSP_USING_UART1
#define BSP_UART1_TX_PIN "PA9"
#define BSP_UART1_RX_PIN "PA10"
#define BSP_UART1_RX_USING_DMA

// 4G IoT模块
#define BSP_USING_UART2
#define BSP_UART2_TX_PIN "PD5"
#define BSP_UART2_RX_PIN "PD6"
#define BSP_UART2_RX_USING_DMA

// RS485 通道
#define BSP_USING_UART6
#define BSP_UART6_TX_PIN "PC6"
#define BSP_UART6_RX_PIN "PC7"
#define BSP_UART6_RX_USING_DMA

// CH9121 网口扩展
#define BSP_USING_UART3
#define BSP_UART3_TX_PIN "PD8"
#define BSP_UART3_RX_PIN "PD9"
#define BSP_UART3_RX_USING_DMA

    /*-------------------------- UART CONFIG END --------------------------*/

    /*-------------------------- I2C CONFIG BEGIN --------------------------*/

    /** if you want to use i2c bus(soft simulate) you can use the following instructions.
     *
     * STEP 1, open i2c driver framework(soft simulate) support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the i2c bus
     *                 such as     #define BSP_USING_I2C1
     *
     * STEP 3, according to the corresponding pin of i2c port, modify the related i2c port and pin
     * information such as     #define BSP_I2C1_SCL_PIN    GET_PIN(port, pin)   ->   GET_PIN(C, 11)
     *                             #define BSP_I2C1_SDA_PIN    GET_PIN(port, pin)   ->   GET_PIN(C,
     * 12)
     */

#define BSP_USING_I2C1
#ifdef BSP_USING_I2C1
#define BSP_I2C1_SCL_PIN GET_PIN(B, 8)
#define BSP_I2C1_SDA_PIN GET_PIN(B, 9)
#endif

#define BSP_USING_I2C2
#ifdef BSP_USING_I2C2
#define BSP_I2C2_SCL_PIN GET_PIN(A, 8)
#define BSP_I2C2_SDA_PIN GET_PIN(C, 9)
#endif

    /*-------------------------- I2C CONFIG END --------------------------*/

    /*-------------------------- SPI CONFIG BEGIN --------------------------*/

    /** if you want to use spi bus you can use the following instructions.
     *
     * STEP 1, open spi driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the spi bus
     *                 such as     #define BSP_USING_SPI1
     *
     * STEP 3, copy your spi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the
     * end of board.c file such as     void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
     *
     * STEP 4, modify your stm32xxxx_hal_config.h file to support spi peripherals. define macro
     * related to the peripherals such as     #define HAL_SPI_MODULE_ENABLED
     */

    /*#define BSP_USING_SPI1*/
    /*#define BSP_USING_SPI2*/
#define BSP_USING_SPI3

    /*-------------------------- SPI CONFIG END --------------------------*/

    /*-------------------------- QSPI CONFIG BEGIN --------------------------*/

    /** if you want to use qspi you can use the following instructions.
     *
     * STEP 1, open qspi driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the qspi
     *                 such as     #define BSP_USING_QSPI
     *
     * STEP 3, copy your qspi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the
     * end of board.c file such as     void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi)
     *
     * STEP 4, modify your stm32xxxx_hal_config.h file to support qspi peripherals. define macro
     * related to the peripherals such as     #define HAL_QSPI_MODULE_ENABLED
     *
     */

    /*#define BSP_USING_QSPI*/

    /*-------------------------- QSPI CONFIG END --------------------------*/

    /*-------------------------- PWM CONFIG BEGIN --------------------------*/

    /** if you want to use pwm you can use the following instructions.
     *
     * STEP 1, open pwm driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the pwm
     *                 such as     #define BSP_USING_PWM1
     *
     * STEP 3, copy your pwm timer init function from stm32xxxx_hal_msp.c generated by stm32cubemx
     * to the end if board.c file such as     void HAL_TIM_Base_MspInit(TIM_HandleTypeDef*
     * htim_base)  and void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
     *
     * STEP 4, modify your stm32xxxx_hal_config.h file to support pwm peripherals. define macro
     * related to the peripherals such as     #define HAL_TIM_MODULE_ENABLED
     *
     */

    /*#define BSP_USING_PWM1*/
    /*#define BSP_USING_PWM2*/
    /*#define BSP_USING_PWM3*/

    /*-------------------------- PWM CONFIG END --------------------------*/

    /*-------------------------- ADC CONFIG BEGIN --------------------------*/

    /** if you want to use adc you can use the following instructions.
     *
     * STEP 1, open adc driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the adc
     *                 such as     #define BSP_USING_ADC1
     *
     * STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the
     * end of board.c file such as     void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
     *
     * STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro
     * related to the peripherals such as     #define HAL_ADC_MODULE_ENABLED
     *
     */

#define BSP_USING_ADC1
    /*#define BSP_USING_ADC2*/
    /*#define BSP_USING_ADC3*/

    typedef struct
    {
        int16_t adc_value;  // ADC原始数值--ADC转换数值

        int16_t vol_value;  // 通道电压值--ADC电压值
        int16_t vol_gain;
        int16_t vol_offset;
        int16_t vol_min;
        int16_t vol_max;

        int16_t phy_value;  // 物理值--实际物理意义数值
        int16_t phy_min;
        int16_t phy_max;
    } AI_Param;
    typedef struct
    {
        int16_t value[3];
    } PI_Param;

    typedef struct
    {
        int16_t adc_value;  // ADC原始数值--ADC转换数值
        int32_t vol_value;  // 通道电压值--ADC电压值
        uint16_t vol_gain;
        int16_t vol_offset;
    } ADS_Param;
    typedef struct
    {
        int32_t voltage[3];
    } VBS_Param;

    typedef struct
    {
        uint8_t value[3];
    } DIN_Param;
    typedef struct
    {
        int16_t st_dac1_hv;
        int16_t st_dac1_lv;

        int16_t st_dac2_hv;
        int16_t st_dac2_lv;

        int16_t mcp_dac1_hv;
        int16_t mcp_dac1_lv;

        int16_t mcp_dac2_hv;
        int16_t mcp_dac2_lv;
    } DAC_Param;

    typedef struct
    {
        int16_t max;
        int16_t min;
        int16_t alarm;
        uint8_t dec;
    } PARAMS_LIMIT;

/*-------------------------- ADC CONFIG END --------------------------*/

/*-------------------------- DAC CONFIG BEGIN --------------------------*/
#define BSP_USING_DAC1

/*-------------------------- DAC CONFIG END --------------------------*/

/*-------------------------- WDT CONFIG BEGIN --------------------------*/

/** if you want to use wdt you can use the following instructions.
 *
 * STEP 1, open wdt driver framework support in the RT-Thread Settings file
 *
 * STEP 2, modify your stm32xxxx_hal_config.h file to support wdt peripherals. define macro related
 * to the peripherals such as     #define HAL_IWDG_MODULE_ENABLED
 *
 */

/*-------------------------- WDT CONFIG END --------------------------*/

/*-------------------------- HARDWARE TIMER CONFIG BEGIN --------------------------*/

/** if you want to use hardware timer you can use the following instructions.
 *
 * STEP 1, open hwtimer driver framework support in the RT-Thread Settings file
 *
 * STEP 2, define macro related to the hwtimer
 *                 such as     #define BSP_USING_TIM  and
 *                             #define BSP_USING_TIM1
 *
 * STEP 3, copy your hardwire timer init function from stm32xxxx_hal_msp.c generated by stm32cubemx
 * to the end of board.c file such as     void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
 *
 * STEP 4, modify your stm32xxxx_hal_config.h file to support hardwere timer peripherals. define
 * macro related to the peripherals such as     #define HAL_TIM_MODULE_ENABLED
 *
 */

/*#define BSP_USING_TIM*/
#ifdef BSP_USING_TIM
/*#define BSP_USING_TIM15*/
/*#define BSP_USING_TIM16*/
/*#define BSP_USING_TIM17*/
#endif

    /*-------------------------- HAREWARE TIMER CONFIG END --------------------------*/

    /*-------------------------- RTC CONFIG BEGIN --------------------------*/

    /** if you want to use rtc(hardware) you can use the following instructions.
     *
     * STEP 1, open rtc driver framework(hardware) support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the rtc
     *                 such as    BSP_USING_ONCHIP_RTC
     *
     * STEP 3, modify your stm32xxxx_hal_config.h file to support rtc peripherals. define macro
     * related to the peripherals such as     #define HAL_RTC_MODULE_ENABLED
     *
     */
    /*#define BSP_USING_ONCHIP_RTC*/

    /*-------------------------- RTC CONFIG END --------------------------*/

    /*-------------------------- SDIO CONFIG BEGIN --------------------------*/

    /** if you want to use sdio you can use the following instructions.
     *
     * STEP 1, open sdio driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the sdio
     *                 such as    BSP_USING_SDIO
     *
     * STEP 3, copy your sdio init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the
     * end of board.c file such as     void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
     *
     * STEP 4, modify your stm32xxxx_hal_config.h file to support sdio peripherals. define macro
     * related to the peripherals such as     #define HAL_SD_MODULE_ENABLED
     *
     * STEP 5, config your device file system or another applications
     *
     */

    /*#define BSP_USING_SDIO*/

    /*-------------------------- SDIO CONFIG END --------------------------*/

    /*-------------------------- ETH CONFIG BEGIN --------------------------*/

    /** if you want to use eth you can use the following instructions.
     *
     * STEP 1, define macro related to the eth
     *                 such as    BSP_USING_ETH
     *
     * STEP 2, copy your eth init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the
     * end if board.c file such as     void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
     *
     * STEP 3, modify your stm32xxxx_hal_config.h file to support eth peripherals. define macro
     * related to the peripherals such as     #define HAL_ETH_MODULE_ENABLED
     *
     * STEP 4, config your phy type
     *                 such as     #define PHY_USING_LAN8720A
     *                             #define PHY_USING_DM9161CEP
     *                             #define PHY_USING_DP83848C
     * STEP 5, implement your phy reset function in the end of board.c file
     *                 void phy_reset(void)
     *
     * STEP 6, config your lwip or other network stack
     *
     */

#define BSP_USING_ETH
#ifdef BSP_USING_ETH
#define PHY_USING_LAN8720A
/*#define PHY_USING_DM9161CEP*/
/*#define PHY_USING_DP83848C*/
#endif
    /*-------------------------- ETH CONFIG END --------------------------*/

    /*-------------------------- USB HOST CONFIG BEGIN --------------------------*/

    /** if you want to use usb host you can use the following instructions.
     *
     * STEP 1, open usb host driver framework support in the RT-Thread Settings file
     *
     * STEP 2, define macro related to the usb host
     *                 such as    BSP_USING_USBHOST
     *
     * STEP 3, copy your usb host init function from stm32xxxx_hal_msp.c generated by stm32cubemx to
     * the end of board.c file such as     void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd)
     *
     * STEP 4, config your usb peripheral clock in SystemClock_Config() generated by STM32CubeMX and
     * replace this function in board.c
     *
     * STEP 5, modify your stm32xxxx_hal_config.h file to support usb host peripherals. define macro
     * related to the peripherals such as     #define HAL_HCD_MODULE_ENABLED
     *
     */

    /*#define BSP_USING_USBHOST*/

    /*-------------------------- USB HOST CONFIG END --------------------------*/

    /*-------------------------- USB DEVICE CONFIG BEGIN --------------------------*/

    /** if you want to use usb device you can use the following instructions.
     *
     * STEP 1, open usb device driver framework support in the RT-Thread Settings file
     *
     * STEP 2 define macro related to the usb device
     *                 such as    BSP_USING_USBDEVICE
     *
     * STEP 3, copy your usb device init function from stm32xxxx_hal_msp.c generated by stm32cubemx
     * to the end of board.c file such as     void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)
     *
     * STEP 4, config your usb peripheral clock in SystemClock_Config() generated by STM32CubeMX and
     * replace this function in board.c
     *
     * STEP 5, modify your stm32xxxx_hal_config.h file to support usb device peripherals. define
     * macro related to the peripherals such as     #define HAL_PCD_MODULE_ENABLED
     *
     */

    /*#define BSP_USING_USBDEVICE*/

    /*-------------------------- USB DEVICE CONFIG END --------------------------*/

    /*-------------------------- ON_CHIP_FLASH CONFIG BEGIN --------------------------*/

    /** if you want to use on chip flash you can use the following instructions.
     *
     * STEP 1 define macro related to the on chip flash
     *                 such as    BSP_USING_ON_CHIP_FLASH
     *
     * STEP 2, modify your stm32xxxx_hal_config.h file to support on chip flash peripherals. define
     * macro related to the peripherals such as     #define HAL_FLASH_MODULE_ENABLED
     *
     */

#define BSP_USING_ON_CHIP_FLASH

    /*-------------------------- ON_CHIP_FLASH CONFIG END --------------------------*/

#ifdef __cplusplus
}
#endif

/*-------------------------- 需求自定义参数 --------------------------*/

#define SYSTEM_VERSION 109u
#define BUILD_TIMES    "2024-09-27"

#define NO_ERROR 0u
#define ERROR_C1 1u
#define ERROR_C2 2u

#define MB_RTU_MASTER 1u
#define MB_RTU_SLAVE  2u

#define MB_START_ADDR     0u
#define MB_READ_NUMBER    32u
#define MB_POLL_SCAN_RATE 1000u

#define RTU_RS485_PIN        GET_PIN(C, 8)
#define RTU_SLAVE_ADDR       1u
#define RTU_UART_DEVICE_NAME "uart6"
#define RTU_PIN_ENABLE_DELAY 10u

// #define PRINT_DEBUG_LOG              1u

/*-------------------------- 线程优先级定义 --------------------------*/
// MODBUS MASTER通信相关
#define B_MB_RTU_MASTER_COM_THREAD_PRIORITY 10
// 模拟量转换相关
#define B_ADC_CVT_THREAD_PRIORITY 12
#define B_DAC_CVT_THREAD_PRIORITY 13
#define B_VAL_CVT_THREAD_PRIORITY 14
// 通信相关
#define B_MB_RTU_SLAVE_COM_THREAD_PRIORITY 17
#define B_MB_TCP_COM_THREAD_PRIORITY       15
#define B_MB_CHT_COM_THREAD_PRIORITY       16
// 输入输出相关
#define B_DI_THREAD_PRIORITY 11
// 控制线程相关
#define B_CTRL_THREAD_PRIORITY 11

/*-------------------------- 线程堆栈大小 --------------------------*/
// 模拟量转换相关
#define B_ADC_CVT_STACK_SIZE 2048
#define B_DAC_CVT_STACK_SIZE 1024
#define B_VAL_CVT_STACK_SIZE 2048
// 控制线程相关
#define B_USR_CTRL_STACK_SIZE 1024
#define B_LQP_CTRL_STACK_SIZE 1024
// 通信相关
#define B_MB_RTU_COM_STACK_SIZE 1024
#define B_MB_TCP_COM_STACK_SIZE 2048
#define B_MB_CHT_COM_STACK_SIZE 2048
// 输入输出相关
#define B_DI_STACK_SIZE 1024
#define B_DO_STACK_SIZE 1024

/*-------------------------- 告警检测 --------------------------*/
typedef struct
{
    rt_bool_t action;
} Alarm_Event;

typedef struct
{
    uint8_t trigg_cnt;
    uint8_t clean_cnt;
    rt_bool_t action;
} DIN_Event;

enum operate_mode
{
    AUTOMATIC = 1,
    MANUAL,
    SHUTDOWN
};

enum operate_ctrl
{
    START = 1,
    STOP,
    FAULT_RESET
};

enum pn_pump
{
    P_PUMP = 1,
    N_PUMP,
};

#endif /* __BOARD_H__ */
